<?php
/**
 * Objeto controller
 * @package mc
 */
/**
 * @package mc
 */
class Controller {
	
	/**
	 * Objeto formulário
	 */
	public $Form = null;
	
	/**
	 * 
	 */
	public function __destruct()
	{
		// fechando a conexão com o banco de dados
		$this->model->closeDb();

		if (count($this->model->erros))
		{
			$msg = "";
			foreach($this->model->erros as $erro)
			{
				$this->setLog($erro,"erros");
				$msg .= $erro."<br />\n";
			}
		}
		if ($msg) echo $msg;
	}
	
	/**
	* Função grava log no diretório temporário
	* @param nome do arquivo
	* @param mensagem a ser gravada o arquivo
	* @return void
	*/
	public function setLog($msg="", $arq="log")
	{
		$fp = fopen(dirname(__FILE__)."/../log/".$arq.".log", "a");
		$ip = $_SERVER['REMOTE_ADDR'];
		if ($_SERVER["HTTP_X_FORWARDED_FOR"]) $ip .= "-".$_SERVER[HTTP_X_FORWARDED_FOR];
		fwrite($fp, date("d/m/Y H:i:s")." ".$_SESSION["login"]." $ip $msg\n");
		fclose($fp);
	}
	
	/** timediff
	 * Author: Felipe Nascimento S. Pena
 	 * E-mail: felipensp [at] gmail [dot] com
	 * ----------------------------------------------------------------------
	 * Informações:
	 * - O timestamp do primeiro argumento deve ser maior que o do segundo.
	 * - Se o segundo argumento não é informado, ou é NULL, será utilizado o
	 *      timestamp atual.
	 *
	 * @param integer $date1 timestamp
	 * @param integer $date2 timestamp
	 * @return array
	 */
	public function timediff($date1 = null, $date2 = null) {
			// Valores padrão
			if (is_null($date1)) $date1 = time();
			if (is_null($date2)) $date2 = time();

			// Verificando argumentos
			if (!is_int($date1) || !is_int($date2)) return false;
			if ($date2 >= $date1) return false;

			// Diferença entre os timestamps
			$diff = $date1 - $date2;

			// horas, minutos, segundos
			$time = array(0, 0, 0);

			if ($diff >= 3600)
					$time[0] = floor(($diff >= 86400) ? ($diff / 86400) * 24 : $diff / 3600);

			if ($calc = ($diff % 3600)) {
					$time[1] = floor($calc / 60);
					$time[2] = $calc % 60;
			}

			return $time;
	}
	
	/**
	 * Configura o objeto Form
	 * @param array $form Dados do formulário
	 * @param array $camp Campos do formulário com suas propriedades
	 * @param string $para Parâmetros complementares
	 * @return void
	 */
	public function setForm($form="", $camp="", $chave)
	{
		
		// devolvendo o formulári para o mesmo local
		$form["action"] = $_REQUEST["pag"];
		
		// definindo alguns campos
		if ($chave)
		{
			$camp["cha"]["tipo"]  = "hidden";
			$camp["cha"]["valor"] = $chave;
		} else
		{
			exit("Chave inválida !!!");
		}
		
		// instanciando objeto MouraForm
		require_once("libs/mouraform/mouraform.php");
		$this->Form = new MouraForm();
		
		// configurando os botões para scafold
		if (!isset($form["botoes"]))
		{
			$form["botoes"]["salvar"]["valor"] 	= "Salvar";
			$form["botoes"]["salvar"]["tipo"] 	= "submit";
			$form["botoes"]["salvar"]["onclick"] = "document.getElementById(\"tip\").value=\"edicao\"";

			$form["botoes"]["excluir"]["valor"] = "Excluir";
			$form["botoes"]["excluir"]["tipo"] 	= "submit";
			if (!isset($form["botoes"]["excluir"]["onclick"]))
			{
				$form["botoes"]["excluir"]["onclick"] = "if (confirm(\"Tem certeza de excluir este registro ?\")) document.getElementById(\"tip\").value=\"exclusao\"; else return false;";
			}
			
			$form["botoes"]["fechar"]["valor"] 	= "Fechar";
			$form["botoes"]["fechar"]["tipo"] 	= "button";
			if (!isset($form["botoes"]["fechar"]["link"])) $form["botoes"]["fechar"]["link"] 	= ".";
			
		}

		// configurando o formulário
		$this->Form->setForm($form,$camp,$_REQUEST["raiz"]."libs/mouraform/");
		
		// atualiznado cabeçalho meta
		$this->meta = $this->Form->meta;
		
	}
	
	/**
	 * Retorna o formulário
	 * @param array $campos Campos do formulário
	 * @return string 
	 */
	public function getForm($campos=array())
	{
		if (count($campos))
		{
			// conforme regra essencial do MC, incrementando o campo chave
			if (!in_array("cha",$campos))
			{
				$this->Form->campos["cha"]["tipo"] = "hidden";
				array_unshift($campos,"cha");
			}
			
			// conforme regra essencial do MC, incrementando o campo tipo
			if (!in_array("tip",$campos))
			{
				$this->Form->campos["tip"]["tipo"]  = "hidden";
				if (!isset($this->Form->campos["tip"]["valor"])) $this->Form->campos["tip"]["valor"]  = "edicao";
				array_unshift($campos,"tip");
			}

			// conforme regra essencial do MC, incrementando o campo identificador, seu nome e seu valor
			if (!in_array($this->model->dao["identificador"],$campos))
			{
				$this->Form->campos[$this->model->dao["identificador"]]["tipo"]  	= "hidden";
				$this->Form->campos[$this->model->dao["identificador"]]["valor"]  	= $this->Form->campos[$this->model->dao["identificador"]]["valor"]  = $this->model->dao["campos"][$this->model->dao["identificador"]]["valor"];
				array_unshift($campos,$this->model->dao["identificador"]);
			}
			
			return $this->Form->getForm($campos);
		} else
		{
			return $this->Form->getForm();
		}
	}
	
	/**
	 * Atualiza o objeto formulário com base nos campos de uma tabela no banco de dados
	 * @param string $tab Nome da tabela
	 * @param array $cam Matriz com os campos que o Model vai recuperar na tabela do banco de dados
	 * @param string $ide Campo identificador na tabela (campo único, geralmente id)
	 * @param string $fil Filtro alternativo para localizar determinado registro, ideal para recuperar o conteúdo do registro.
	 * @return void
	 */
	public function setDadosForm($tab="", $cam=array(), $ide="id", $fil="")
	{
		// atualizando os valores de cada campo, com base no banco de dados
		$this->model->setDao($tab, $cam, $ide, $fil);
		
		// atualizando campo a campo
		foreach($this->model->dao["campos"] as $campo => $propriedades)
		{
			if ($this->Form->campos[$campo]["tipo"]!="senha") $this->Form->campos[$campo]["valor"] = $this->model->dao["campos"][$campo]["valor"];
		}

	}
	
	/**
	 * Retorna a sql de atualização do objeto dao, com base nos campos de formulário
	 * @param string $tab Nome da tabela no banco de dados
	 * @param string $ide Nome do campo identificador na tabela, necessário para realizar WHERE
	 * @return string $sql
	 */
	public function getSqlForm($tab="", $ide="id")
	{
		// dando um loop nos campos para formatar a sql
		if ($_POST["tip"] == "exclusao")
		{
			$sql = "DELETE FROM $tab WHERE $ide=".$_POST["".$ide.""]." limit 1";
		} else
		{
			$sql_edit 	= "";
			$sql_campos = "";
			$sql_dados  = "";
			foreach($this->Form->campos as $campo => $propriedades)
			{
				if ( 	$campo != $ide 
						&& !$propriedades["desativar"]
						&& $campo != "cha"
						&& $campo != "tip"
						&& isset($_POST[$this->Form->getTitulo($campo)])
					)
				{
					switch($_POST["tip"])
					{
						case "inclusao":
							$sql_campos .= $campo.", ";
							$sql_dados	.= "'".$_POST[$this->Form->getTitulo($campo)]."', ";							
							break;
						default:
							$sql_edit .= "$campo='".$_POST[$this->Form->getTitulo($campo)]."', ";
					}
				}
			}
			if ($_POST["tip"]=="inclusao")
			{
				$sql_campos = substr(trim($sql_campos),0,strlen(trim($sql_campos))-1);
				$sql_dados  = substr(trim($sql_dados),0,strlen(trim($sql_dados))-1);
				$sql = "INSERT INTO $tab ($sql_campos) VALUES ($sql_dados) LIMIT 1";
			} else
			{
				$sql_edit = substr(trim($sql_edit),0,strlen(trim($sql_edit))-1);
				$sql = "UPDATE $tab SET ".$sql_edit;
				$sql .= " WHERE $ide=".$_POST["".$ide.""]." limit 1";
			}
		}
		
		return $sql;
	}
}

?>
